package com.factory.rental.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.factory.rental.dto.PriceDTO;
import com.factory.rental.model.Price;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Optional;

/**
 * 价格策略服务接口
 */
public interface PriceService extends IService<Price> {
    /**
     * 保存价格策略
     * @param priceDTO 价格策略DTO
     * @return 保存后的价格策略实体
     */
    Price savePrice(PriceDTO priceDTO);

    /**
     * 根据ID获取价格策略
     * @param id 价格策略ID
     * @return 价格策略实体
     */
    Optional<Price> getPriceById(Long id);

    /**
     * 根据类型获取价格策略列表
     * @param type 价格类型
     * @return 价格策略列表
     */
    List<Price> getPricesByType(Price.PriceType type);

    /**
     * 根据房间类型获取价格策略列表
     * @param roomType 房间类型
     * @return 价格策略列表
     */
    List<Price> getPricesByRoomType(String roomType);

    /**
     * 获取所有价格策略（分页）
     * @param pageable 分页参数
     * @return 分页后的价格策略列表
     */
    Page<Price> getAllPrices(Pageable pageable);

    /**
     * 更新价格策略
     * @param id 价格策略ID
     * @param priceDTO 价格策略DTO
     * @return 更新后的价格策略实体
     */
    Price updatePrice(Long id, PriceDTO priceDTO);

    /**
     * 删除价格策略
     * @param id 价格策略ID
     */
    void deletePrice(Long id);

    /**
     * 更新价格策略状态
     * @param id 价格策略ID
     * @param enabled 是否启用
     */
    void updatePriceStatus(Long id, boolean enabled);

    /**
     * 获取有效的价格策略
     * @return 有效的价格策略列表
     */
    List<Price> getEffectivePrices();

    /**
     * 计算房间的费用
     * @param roomId 房间ID
     * @param days 天数
     * @param priceType 价格类型
     * @return 费用金额
     */
    BigDecimal calculateCost(Long roomId, int days, Price.PriceType priceType);

    /**
     * 获取费用分析数据
     * @return 费用分析数据
     */
    List<PriceAnalysisDTO> getCostAnalysis();
}

/**
 * 价格分析DTO
 */
interface PriceAnalysisDTO {
    /**
     * 获取价格类型
     * @return 价格类型
     */
    Price.PriceType getPriceType();

    /**
     * 获取平均价格
     * @return 平均价格
     */
    BigDecimal getAveragePrice();

    /**
     * 获取价格范围
     * @return 价格范围
     */
    String getPriceRange();

    /**
     * 获取策略数量
     * @return 策略数量
     */
    Long getStrategyCount();
}